const a = {
    i: 100,
    j: 'aa',
    valueOf() {
        console.log('调用valueOf');
        return this.i
        // return {}
    },
    toString() {
        console.log('调用toString');
        return this.j
        // return []
    }
}
// 对于一个对象，如果既没有重写valueOf也没有重写toString，则与基本数据类型做运算时会调用toString方法
// 如果只重写valueOf就调用valueOf，只重写toString就调用toString
// 如果二者都重写了，就调用valueOf（需要判断返回值是否为基本数据类型）
// 
// console.log('b' + a)
// 对于一个对象，既没有重写valueOf也没有重写toString，调用该对象的valueOf，返回该对象自身
console.log(10 + a)
// console.log(a > 10);
let aa = [1, 2, 3]
let b = []
console.log(aa.toString());
console.log(aa.valueOf());
console.log(b.toString());

if([]) {
    console.log('[]为true啦');
}
if(null == undefined) {
    console.log('为true啦');
}
console.log('foo'+ +'bar');
console.log("true" == true);
console.log("false" == false);
console.log("" == null);
console.log(!!"false" == !!"true");
console.log(["x"] == "x");
console.log([] + null + 1); // null1
console.log([1, 2, 3] == [1, 2, 3]); // false
console.log({} + [] + {} + [1]);
console.log(! + [] + [] + ![]);
console.log({} - []);
console.log(false - []);